#!/bin/bash 

#背景：某些户外物联网项目，它的工控机硬件平台自带4G模块，能够通过物联网卡将自己的数据推送到云平台。
#但是，因为运营商的网络，会经常定期在基站进行维护，过一阵子移动网络就会在基站侧就断开，出现网络掉线，导致工控机在线下进行脱管。
#
#解决方案一：
#某些有经验的手机厂商、硬件设备厂商们，会在驱动程序层面，在检测到断联之后，通过4G模块的AT指令进行重新拨号上网，解决掉线的问题。
#灵狐最初也想通过这个方案来解决这个4G工控机掉线的问题，但是测试发现UBUNTU内置的4G模块驱动程序并不稳定，在某些情况下，
#比如SIM卡接触不良，SIM卡弹出再插入，UBUNTU自带的驱动程序没处理好这个场景，自己直接进程崩溃掉了，即使能够在4G模块AT重新拨号上网，
#也无法以网卡驱动程序的方式，供操作系统的程序们使用了，灵狐被迫放弃了这种解决方案
#
#解决方案二：
#为了解决UBUNTU网卡驱动程序崩溃的问题，采用的是检测到以太网和GSM网络都不可用的情况下，重启工控机的方案，直接重启计算机启动到完成
#拨号的流程方案。这个方案，简单粗暴，但确实可用，代价就是断网后，重启的短暂时刻，工控机是不可使用的。
#目前灵狐为这个方案提供了脚本，用户在充分理解上面这个方案的背景后，可以斟酌使用


#参考脚本：https://www.cnblogs.com/zhaooyw/p/16029189.html

#检查：IP地址是否有效
function check_ip() {
    local IP=$1
    VALID_CHECK=$(echo $IP|awk -F. '$1<=255&&$2<=255&&$3<=255&&$4<=255{print "yes"}')
    if echo $IP|grep -E "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$" >/dev/null; then
        if [ $VALID_CHECK == "yes" ]; then
            echo "true"
        else
            echo "false"
        fi
    else
        echo "false"
    fi
}


CNT=0
while true; do		
	#场景1：移动网络可用
	
	#筛选出nmcli命令中，gsm建立的移动网络，获得其中的IP地址
    IP4G=`nmcli -a | grep -A 1 'gsm (' | grep -o -E '([0-9]{1,3}\.){3}[0-9]{1,3}'`
	

	#执行IP地址的检查
	OK=$(check_ip $IP4G)
	if [[ $OK == "true" ]]; then
		CNT=0
		#echo "移动网络成功连接，分配的IP地址： $IP4G"
		sleep 10
		continue
	fi
	
	#场景2：局域网可用
	
	#筛选出nmcli命令中，可用的局域网，获得其中的IP地址
    IPETH=`nmcli -a | grep -A 0 'inet4 ' | grep -o -E '([0-9]{1,3}\.){3}[0-9]{1,3}'`
	
	#执行IP地址的检查
	OK=$(check_ip $IPETH)
	if [[ $OK == "true" ]]; then
		CNT=0
		#echo "局域网成功连接，分配的IP地址： $IPETH"
		sleep 10
		continue
	fi
	
	#场景3：
	CNT=$(($CNT+1))
	if [[ 60 -gt $CNT ]]; then
		echo "移动网络和局域网都断开了，继续检测网络状态，第$CNT次......"
		sleep 10
		continue
	fi
	

	echo "局域网和移动网络均不可用，准备60秒钟后通过重启计算机，复位移动网络的连接，期间你可用CTRL+C中断该重启过程"
	sleep 60
	reboot
done



